/******************************************************************************* * Copyright (c) 2015 Jeff Martin. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public * License v3.0 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * Contributors: * Jeff Martin - initial API and implementation ******************************************************************************/ package cuchaz.enigma.convert; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Collection; import java.util.List; import com.google.common.collect.Lists; import cuchaz.enigma.mapping.ClassEntry; import cuchaz.enigma.mapping.Entry; import cuchaz.enigma.mapping.EntryFactory; import cuchaz.enigma.mapping.FieldEntry; import cuchaz.enigma.mapping.Type; public class MatchesReader { public static ClassMatches readClasses(File file) throws IOException { try(BufferedReader in = new BufferedReader(new FileReader(file))) { ClassMatches matches = new ClassMatches(); String line = null; while((line = in.readLine()) != null) matches.add(readClassMatch(line)); return matches; } } private static ClassMatch readClassMatch(String line) throws IOException { String[] sides = line.split(":", 2); return new ClassMatch(readClasses(sides[0]), readClasses(sides[1])); } private static Collection<ClassEntry> readClasses(String in) { List<ClassEntry> entries = Lists.newArrayList(); for(String className : in.split(",")) { className = className.trim(); if(className.length() > 0) entries.add(new ClassEntry(className)); } return entries; } public static <T extends Entry> MemberMatches<T> readMembers(File file) throws IOException { try(BufferedReader in = new BufferedReader(new FileReader(file))) { MemberMatches<T> matches = new MemberMatches<T>(); String line = null; while((line = in.readLine()) != null) readMemberMatch(matches, line); return matches; } } private static <T extends Entry> void readMemberMatch( MemberMatches<T> matches, String line) { if(line.startsWith("!")) { T source = readEntry(line.substring(1)); matches.addUnmatchableSourceEntry(source); }else { String[] parts = line.split(":", 2); T source = readEntry(parts[0]); T dest = readEntry(parts[1]); if(source != null && dest != null) matches.addMatch(source, dest); else if(source != null) matches.addUnmatchedSourceEntry(source); else if(dest != null) matches.addUnmatchedDestEntry(dest); } } @SuppressWarnings("unchecked") private static <T extends Entry> T readEntry(String in) { if(in.length() <= 0) return null; String[] parts = in.split(" "); if(parts.length == 3 && parts[2].indexOf('(') < 0) return (T)new FieldEntry(new ClassEntry(parts[0]), parts[1], new Type(parts[2])); else { assert parts.length == 2 || parts.length == 3; if(parts.length == 2) return (T)EntryFactory.getBehaviorEntry(parts[0], parts[1]); else if(parts.length == 3) return (T)EntryFactory.getBehaviorEntry(parts[0], parts[1], parts[2]); else throw new Error("Malformed behavior entry: " + in); } } }